
/**
 * 返回一个 store 仓库对象
 * @param {*} reducer 处理器函数
 */
export default function createStore(reducer) {
  let state;
  const listeners = [] // 监听器数组
  /**
   * 返回仓库状态
   */
  function getState() {
    return state
  }

  /**
   * 保存监听函数 当状态发生变化后执行所有的监听函数
   */
  function subscribe(listener) {
    listeners.push(listener)
    return () => { // 取消订阅函数
      let index = listeners.indexOf(listener) // 获取当前订阅函数在数组中的索引
      listeners.splice(index, 1) // 从数组中移除当前订阅函数
    }
  }

  /**
   * 向仓库派发动作
   */
  function dispatch(action) {
    state = reducer(state, action) // 根据老状态 和 动作 计算出新状态
    listeners.forEach(listener => listener()) // 执行所有的监听函数
  }

  // 内部派发一次 用于初始化仓库的状态
  dispatch({type: "@@REDUX/INIT"})
  
  return {
    getState, // 返回仓库状态
    subscribe, // 保存监听函数
    dispatch, // 派发动作函数
  }
}
